package com.eascs.web.o2o.scheduler.history;

import com.eascs.app.dao.DataSourceSetting;
import com.eascs.app.log.Logger;
import com.eascs.app.log.LoggerFactory;
import com.eascs.app.runtime.RuntimeSetting;
import com.eascs.common.util.StopWatch;
import com.eascs.web.o2o.scheduler.service.*;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.inject.Inject;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

/**
 * 这个定时任务是以前数据中心数据出报表时的定时任务，基本已经弃用
 * @author user
 * @version V1.0 TODO(定时同步) 2017年1月5日 下午1:53:44
 */
@Component("reportHisTask")
public class ReportHisTask {
	
	protected final Logger logger = LoggerFactory.getLogger(getClass());
	@Inject
	AdapterDataService adapterDataService;
	@Inject
	AdpterAfterLoanDataService adpterAfterLoanDataService;
	@Inject
	BpPerformanceService bpPerformanceService;
	@Inject
	PaymentDetailService paymentDetailService;
	@Inject
	PaymentPlanService paymentPlanService;
	@Inject
	LoanBaseInfoService loanBaseInfoService;
	@Inject
	SynoInfoService synoInfoService;
	
	@Autowired
	@Qualifier("dataSourceSettingDb1")
	DataSourceSetting dataSourceSettingDb1;
	
	/**
	 * 将OA中的基础数据同步到数据中心
	 */
	//@Scheduled(cron = "0 00 0 * * ?")
	public void job() {
		logger.info("OA数据同步任务开始......");
		StopWatch stopWatch = new StopWatch();
		adapterDataService.saveData();
		logger.info("OA数据同步任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}

	/**
	 * 贷中数据抽取
	 */
	//@Scheduled(cron = "0 10 2 * * ?")
	public void saveLoaningJob() {
		logger.info("贷中数据抽取任务开始......");
		StopWatch stopWatch = new StopWatch();
		try {
			adapterDataService.initLoaningBillCode(1);// 初始新系统贷款编号
			adapterDataService.saveBasicInformationLoaning();
			adapterDataService.updateFKDate();// 更新贷中放款时间
			synoInfoService.save("贷中", 1);
		} catch (Exception e) {
			synoInfoService.save("贷中", 0);
			e.printStackTrace();
			logger.error("贷中数据抽取异常[{}]", e);
			logger.error("贷中数据抽取异常-msg[{}]", e.getMessage());
		}

		logger.info("贷中数据抽取任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}

	
	
	
	/**
	 * 贷后数据抽取
	 */
	//@Scheduled(cron = "0 50 1 * * ?")
	public void saveAfterLoanJob() {
		logger.info("贷后数据抽取任务开始......");
		StopWatch stopWatch = new StopWatch();
		try {
			adpterAfterLoanDataService.saveBasiInformationAfterLoan();
			synoInfoService.save("贷后", 1);
		} catch (Exception e) {
			logger.error("贷后数据同步异常{}", e);
			logger.error("贷后数据同步异常-msg[{}]", e.getMessage());
			e.printStackTrace();
			synoInfoService.save("贷后", 0);
		}
		logger.info("贷后数据抽取任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}
	
	
	/**
	 *  同步o2o_customer数据（放款次数，第一次放款时间）
	 */
	//@Scheduled(cron = "0 30 2 * * ?")
	public void saveCustomerAndRefundData() {
		logger.info("用户中心数据和放款数据同步任务开始......");
		StopWatch stopWatch = new StopWatch();
		adapterDataService.saveCustomerAndRefundData();// 同步o2o_customer数据（放款次数，第一次放款时间）
		logger.info("用户中心数据和放款数据同步任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}
	
	
	//@Scheduled(cron = "0 30 3 * * ?")
	public void saveRefund_add() {
		logger.info("同步银行放款数据开始......");
		try {
			adapterDataService.saveRefund_add();
		} catch (Exception e) {
			logger.error("同步银行放款数据出现异常......");
			throw e;
		}
		logger.info("同步银行放款数据结束......");
	}

	/**
	 * savePaymentPlan 还款计划
	 */
	//@Scheduled(cron = "0 20 00 * * ?")
	public void savePaymentPlan() {
		logger.info("还款计划数据同步任务开始......");
		StopWatch stopWatch = new StopWatch();
		paymentPlanService.savePaymentPlan();
		logger.info("还款计划数据同步任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}
	

	//@Scheduled(cron = "0 00 3 * * ?")
	public void saveO2oPaymentDtail() {
		logger.info("用户中心财务明细数据同步任务开始......");
		StopWatch stopWatch = new StopWatch();
		paymentDetailService.savePaymentDetail();
		logger.info("用户中心财务明细数据同步任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}

	

	
	
	
	
	/**
	 * 同步业务系统逾期表到basic_information_overdue表中
	 */
	//@Scheduled(cron = "0 0/30 * * * ?")
	public void loadOverdue(){
		adpterAfterLoanDataService.loadServiceOverdue();
	}

	/**
	 * 业务：30分钟一次，“贷前，贷中，贷后”数据抽取
	 * 数据来源：只同步新系统数据
	 * 同步方式：增量
	 * 
	 * 同步贷后数据需要准备：放款状态，还款计划，放款时间，到期日
	 * 
	 * 
	 */
	//@Scheduled(cron = "0 0/30 * * * ?")
	public void loanloanSynchronizationJob() {
		logger.info("=========================新系统贷据同步任务开始=========================");
		logger.info("dataSourceDb1:" + dataSourceSettingDb1.getUrl());

		StopWatch stopWatch0 = new StopWatch();
		
		StopWatch stopWatch = new StopWatch();
		try {
			logger.info("新系统贷前数据同步开始");
			loanBaseInfoService.saveBaseO2oByNew();//增量同步，只同步新系统的数据
			//放款时间的优化(贷前的放款时间)（非BK类型的贷款单）
			loanBaseInfoService.loanTime();
			logger.info("新系统贷前数据同步结束");
		} catch (Exception e) {
			logger.error("新系统贷前数据同步异常", e);
			logger.error("新系统贷前数据同步异常-msg", e.getMessage());
		}
		logger.info("新系统贷前数据同步任务结束，共耗时：[{}]分", stopWatch.elapsedTime() / 60000);
		
		stopWatch = new StopWatch();
		try {
			logger.info("续贷字段同步(贷款次数，是否续贷)同步开始");
			loanBaseInfoService.renewLoan();
			logger.info("续贷字段同步(贷款次数，是否续贷)同步结束");
		} catch (Exception e) {
			logger.error("续贷字段同步(贷款次数，是否续贷)同步异常", e);
			logger.error("续贷字段同步(贷款次数，是否续贷)同步异常-msg", e.getMessage());
		}
		logger.info("续贷字段同步(贷款次数，是否续贷)同步任务结束，共耗时：[{}]分", stopWatch.elapsedTime() / 60000);
		//贷中数据抽取
		logger.info("新系统贷中数据同步任务开始......");
		stopWatch = new StopWatch();
		try {
			adapterDataService.saveBasicInformationLoaning();
			//放款时间的优化(贷中的放款时间)
			adapterDataService.updateLoantime();
		} catch (Exception e) {
			logger.error("新系统贷中数据同步异常", e);
			logger.error("新系统贷中数据同步异常-msg", e.getMessage());
		}
		logger.info("新系统贷中数据同步任务结束，共耗时：[{}]分", stopWatch.elapsedTime() / 60000);

		//贷后数据抽取
		logger.info("新系统贷后数据抽取任务开始......");
		stopWatch = new StopWatch();
		try {
			//adpterAfterLoanDataService.saveNewBasiInformationAfterLoan();
		} catch (Exception e) {
			logger.error("新系统贷后数据同步异常[{}]", e);
			logger.error("新系统贷后数据同步异常-msg[{}]", e.getMessage());
		}
		logger.info("新系统贷后数据抽取任务结束，共耗时：[{}]分", stopWatch.elapsedTime() / 60000);
		
		
		
		logger.info("半小时同步一次任务结束，共耗时：[{}]分===========================================", stopWatch0.elapsedTime() / 60000);
	}
	
	
	
	/**
	 * 全国各省区品牌贷投放情况：月度和季度任务报表 每月最后一天晚上23点触发
	 *
	 */
	// @Scheduled(cron = "0 0 23 * * ?")
	public void bpPerformanceReportPerMonth() {
		// 每月最后一天
		if (!isLastDayOfMonth())
			return;

		StopWatch stopWatch = new StopWatch();
		int currYear = bpPerformanceService.getCurrentYear();
		int currMonth = bpPerformanceService.getCurrentMonth();

		try {
			bpPerformanceService.initTaskOfTheMonths(currYear, currMonth);
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("[BP]品牌贷月度和季度任务报表[月度]任务失败，共耗时：[{}]秒,异常[{}]", stopWatch.elapsedTime() / 1000, e);
			return;
		}

		logger.info("[BP]品牌贷月度和季度任务报表[月度]任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}

	/**
	 * 全国各省区品牌贷投放情况：月度和季度任务报表 每季度最后一天晚上23点30分触发
	 */
	// @Scheduled(cron = "0 30 23 * 3,6,9,12 ?")
	public void bpPerformanceReportPerQuarter() {
		// 每月最后一天
		if (!isLastDayOfMonth())
			return;

		StopWatch stopWatch = new StopWatch();
		int currYear = bpPerformanceService.getCurrentYear();
		int currMonth = bpPerformanceService.getCurrentMonth();

		try {
			bpPerformanceService.initTaskOfTheQuarter(currYear, currMonth);
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("[BP]品牌贷月度和季度任务报表[季度]任务失败，共耗时：[{}]秒,异常[{}]", stopWatch.elapsedTime() / 1000, e);
			return;
		}
		logger.info("[BP]品牌贷月度和季度任务报表[季度]任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);

	}

	/**
	 * 品牌贷--品牌贷投放月度考核和季度考核报表发送
	 */
	//@Scheduled(cron = "0 15 08 * * ?")
	public void bpPerformanceReportSend() {
		StopWatch stopWatch = new StopWatch();
		int currYear = bpPerformanceService.getCurrentYear();
		int currMonth = bpPerformanceService.getCurrentMonth();

		try {
			// 月度数据生成
			bpPerformanceService.initTaskOfTheMonths(currYear, currMonth);
			// 季度数据生成
			bpPerformanceService.initTaskOfTheQuarter(currYear, currMonth);
			// 生成报表
			bpPerformanceService.generateBpReport(currMonth);
			// 发送报表
			bpPerformanceService.bpPerformanceReportSend();
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("[BP]品牌贷月度和季度任务报表[报表发送]任务失败，共耗时：[{}]秒,异常[{}]", stopWatch.elapsedTime() / 1000, e);
			return;
		}
		logger.info("[BP]品牌贷月度和季度任务报表[报表发送]任务结束，共耗时：[{}]秒", stopWatch.elapsedTime() / 1000);
	}

	/**
	 * 是否是本月最后一天
	 * 
	 * @return 是否
	 */
	private boolean isLastDayOfMonth() {
		RuntimeSetting runtimeSetting = RuntimeSetting.get();
		boolean devEnv = runtimeSetting.getEnv().equals("dev");
		// 每月最后一天
		LocalDate lastDateOfMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
		return !(lastDateOfMonth.getDayOfMonth() != LocalDate.now().getDayOfMonth() && !devEnv);

	}
	

}
